/*
 *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
 *
 *  Redistribution and use in source and binary forms, with or without
 *  modification, are permitted provided that the following conditions are met:
 *
 *  Redistributions of source code must retain the above copyright notice,
 *  this list of conditions and the following disclaimer.
 *  Redistributions in binary form must reproduce the above copyright
 *  notice, this list of conditions and the following disclaimer in the
 *  documentation and/or other materials provided with the distribution.
 *  Neither the name of the dreamlu.net developer nor the names of its
 *  contributors may be used to endorse or promote products derived from
 *  this software without specific prior written permission.
 *  Author: Chill 庄骞 (smallchill@163.com)
 */
package org.springblade.modules.mes.base.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;

import lombok.AllArgsConstructor;
import javax.validation.Valid;

import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.Func;
import org.springblade.modules.mes.base.entity.MaterialType;
import org.springblade.modules.mes.base.service.IMaterialTypeService;
import org.springblade.modules.mes.base.vo.MaterialTypeVO;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RequestParam;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springblade.core.boot.ctrl.BladeController;

import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 材料类型 控制器
 *
 * @author BladeX
 * @since 2020-09-10
 */
@RestController
@AllArgsConstructor
@RequestMapping("/materialtype")
@Api(value = "材料类型", tags = "材料类型接口")
public class MaterialTypeController extends BladeController {

	private final IMaterialTypeService materialTypeService;

	/**
	 * 详情
	 */
	@GetMapping("/detail")
	//@ApiOperationSupport(order = 1)
	@ApiOperation(value = "详情", notes = "传入materialType")
	public R<MaterialType> detail(MaterialType materialType) {
		MaterialType detail = materialTypeService.getOne(Condition.getQueryWrapper(materialType));
		return R.data(detail);
	}

	/**
	 * 不分页 材料类型
	 */
	@GetMapping("/list")
	//@ApiOperationSupport(order = 2)
	@ApiOperation(value = "不分页", notes = "传入materialType")
	public R<List<MaterialTypeVO>> list(MaterialTypeVO materialTypeVO, Query query) {
		List<MaterialTypeVO> materialTypeList = materialTypeService.getMaterialTypeVOList(materialTypeVO);
		return R.data(materialTypeList);
	}


	/**
	 * 分页 材料类型
	 */
	@GetMapping("/pagelist")
	//@ApiOperationSupport(order = 2)
	@ApiOperation(value = "分页", notes = "传入materialType")
	public R<IPage<MaterialType>> pageList(MaterialType materialType, Query query) {
		IPage<MaterialType> pages = materialTypeService.page(Condition.getPage(query), Condition.getQueryWrapper(materialType));
		return R.data(pages);
	}

	/**
	 * 自定义分页 材料类型
	 */
	@GetMapping("/page")
	//@ApiOperationSupport(order = 3)
	@ApiOperation(value = "分页", notes = "传入materialType")
	public R<IPage<MaterialTypeVO>> page(MaterialTypeVO materialType, Query query) {
		IPage<MaterialTypeVO> pages = materialTypeService.selectMaterialTypePage(Condition.getPage(query), materialType);
		return R.data(pages);
	}

	/**
	 * 新增 材料类型
	 */
	@PostMapping("/save")
	//@ApiOperationSupport(order = 4)
	@ApiOperation(value = "新增", notes = "传入materialType")
	public R save(@Valid @RequestBody MaterialType materialType) {
		long count = materialTypeService.count(new QueryWrapper<MaterialType>().eq("name", materialType.getName()));
		if(count > 0){
			return R.fail("材料类型名称已存在，请重新编辑！");
		}
		if("1".equals(materialType.getRawMaterialFlag())){
			long count2 = materialTypeService.count(new QueryWrapper<MaterialType>().eq("raw_material_flag", materialType.getRawMaterialFlag()));
			if(count2 > 0){
				return R.fail("只能标识一种材料为原材料！");
			}
		}

		boolean flag = materialTypeService.save(materialType);
		/**异步向物流推送材料类型信息-新增 start**/
		/*if(flag){
			ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
			PrdAndMaterialTypeSyncThread thread = new PrdAndMaterialTypeSyncThread(1,1,null,materialType,null);
			cachedThreadPool.execute(thread);
		}*/
		/**异步向物流推送材料类型信息-新增 end**/
		return R.status(flag);
	}

	/**
	 * 修改 材料类型
	 */
	@PostMapping("/update")
	//@ApiOperationSupport(order = 5)
	@ApiOperation(value = "修改", notes = "传入materialType")
	public R update(@Valid @RequestBody MaterialType materialType) {
		long count = materialTypeService.count(new QueryWrapper<MaterialType>().eq("name", materialType.getName()).ne("id", materialType.getId()));
		if(count > 0){
			return R.fail("材料类型名称已存在，请重新编辑！");
		}

		if("1".equals(materialType.getRawMaterialFlag())){
			long count2 = materialTypeService.count(new QueryWrapper<MaterialType>().eq("raw_material_flag", materialType.getRawMaterialFlag())
					.ne("id", materialType.getId()));
			if(count2 > 0){
				return R.fail("只能标识一种材料为原材料！");
			}
		}

		boolean flag = materialTypeService.updateById(materialType);
		/**异步向物流推送材料类型信息-修改 start**/
		/*if(flag){
			ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
			PrdAndMaterialTypeSyncThread thread = new PrdAndMaterialTypeSyncThread(1,2,null,materialType,null);
			cachedThreadPool.execute(thread);
		}*/
		/**异步向物流推送材料类型信息-修改 end**/
		return R.status(flag);
	}

//	/**
//	 * 新增或修改 材料类型
//	 */
//	@PostMapping("/submit")
//	//@ApiOperationSupport(order = 6)
//	@ApiOperation(value = "新增或修改", notes = "传入materialType")
//	public R submit(@Valid @RequestBody MaterialType materialType) {
//		int count = materialTypeService.count(new QueryWrapper<MaterialType>().eq("name", materialType.getName()).ne("id", materialType.getId()));
//		if(count > 0){
//			return R.fail("材料类型名称已存在，请重新编辑！");
//		}
//
//		if("1".equals(materialType.getRawMaterialFlag())){
//			int count2 = materialTypeService.count(new QueryWrapper<MaterialType>().eq("raw_material_flag", materialType.getRawMaterialFlag())
//					.ne("id", materialType.getId()));
//			if(count2 > 0){
//				return R.fail("只能标识一种材料为原材料！");
//			}
//		}
//
//		return R.status(materialTypeService.saveOrUpdate(materialType));
//	}


	/**
	 * 删除 材料类型
	 */
	@PostMapping("/remove")
	//@ApiOperationSupport(order = 7)
	@ApiOperation(value = "逻辑删除", notes = "传入ids")
	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
		boolean flag = materialTypeService.deleteLogic(Func.toLongList(ids));
		/**异步向物流推送材料类型信息-删除 start**/
		/*if(flag){
			ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
			PrdAndMaterialTypeSyncThread thread = new PrdAndMaterialTypeSyncThread(1,3,null,null,Func.toLongList(ids));
			cachedThreadPool.execute(thread);
		}*/
		/**异步向物流推送材料类型信息-删除 end**/
		return R.status(flag);
	}


}
